/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package worms;

import gameengine.*;
import java.awt.*;
import java.awt.geom.*;
import network.messages.*;

/**
 * Classe que representa um tiro
 * @author Victor
 */
public class Tiro extends SpriteEstatica implements IUpdateable
{
	private final int VELOCIDADE = 20;
	private final int DANO_TIRO = -1;

	private Point _posicaoTiro;
	private double _angulo;
	private Point2D vetorTrigonometrico;
	private int _idOwner;

	private GameContainer container;

	/**
	 * Retorna o angulo do tiro
	 * @owner Victor
	 */
	public double GetAngulo()
	{
		return _angulo;
	}

	/**
	 * Seta o angulo do tiro
	 * @owner Victor
	 */
	public void SetAngulo(double angulo)
	{
		_angulo = angulo;
	}

	/**
	 * Retorna a posição do tiro
	 * @owner Victor
	 */
	public Point GetPosicaoTiro()
	{
		return _posicaoTiro;
	}

	/**
	 * Seta a posição do tiro
	 * @owner Victor
	 */
	public void SetPosicaoTiro(Point posicaoTiro)
	{
		_posicaoTiro = posicaoTiro;
	}

	/**
	 * Retorna o id do dono do tiro
	 * @owner Victor
	 */
	public int GetIdOwner()
	{
		return _idOwner;
	}

	/**
	 * Retorna uma mensagem utilizando os dados desse tiro
	 * @owner Victor
	 */
	public MensagemTiro GetMensagemTiro()
	{
		MensagemTiro mensagemTiro = new MensagemTiro();
		mensagemTiro.SetAnguloTiro(GetAngulo());
		mensagemTiro.SetPosicaoX(GetPosicaoTiro().x);
		mensagemTiro.SetPosicaoY(GetPosicaoTiro().y);
		mensagemTiro.SetIdCliente(GetIdOwner());

		return mensagemTiro;
	}

	public Tiro(Point posicaoTiro, double angulo, int idOwner, GameContainer container)
	{
		super(new Textura("./src/worms/images/tiro.png"), posicaoTiro);
		_posicaoTiro = posicaoTiro;
		_angulo = angulo;
		_idOwner = idOwner;
		this.container = container;

		vetorTrigonometrico = new Point2D.Float((float)Math.cos(angulo), (float)Math.sin(angulo));
	}

	public Tiro(MensagemTiro mensagemTiro, GameContainer container)
	{
		this(new Point(mensagemTiro.GetPosicaoX(), mensagemTiro.GetPosicaoY()), mensagemTiro.GetAnguloTiro(), mensagemTiro.GetIdCliente(), container);
	}

	/**
	 * Atualiza o tiro
	 * @owner Victor
	 */
	public void Atualizar(float milisegundos)
	{
		SetPosicao(GetPosicao().x + (int)(vetorTrigonometrico.getX() * VELOCIDADE), GetPosicao().y + (int)(vetorTrigonometrico.getY() * VELOCIDADE));

		int x = GetPosicao().x;
		int y = GetPosicao().y;

		boolean colidiuComPersonagem = false;
		Player personagemColidido = null;
		
		for(Object spriteObject : container.GetAllSprites())
		{
			if (spriteObject instanceof Player)
			{
				Player player = (Player) spriteObject;
				if (player.GetId() != GetIdOwner() && GetRetanguloColisao().intersects(player.GetRetanguloColisao()))
				{
					colidiuComPersonagem = true;
					personagemColidido = player;
					break;
				}
			}
		}

		if (x < -100 || x > container.getWidth() || y < -100 || y > container.getHeight() || colidiuComPersonagem)
		{
			if (colidiuComPersonagem)
			{
				personagemColidido.DominuirVida(DANO_TIRO);
			}

			container.RemoveSprite(this);
		}
	}
}
